package com.lyy.util;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.lyy.constant.MinioConst;
import io.minio.MinioClient;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

/** @author JoeZhou */
@Slf4j
public class MinioUtil {  
  
    /** Minio客户端 */  
    private static MinioClient minioClient;  
  
    static {  
        try {  
            // 创建MinIO客户端  
            minioClient = new MinioClient(MinioConst.END_POINT, MinioConst.ACCESS_KEY, MinioConst.SECRET_KEY);
        } catch (Exception e) {  
            log.error("MinioClient实例化失败: {}", e.getMessage());  
        }  
    }  
  
    /**  
     * 根据文件对象获取随机文件名称  
     *  
     * @param file 文件对象  
     * @return 随机文件名称，格式为 "UUID后10位 + 当前时间戳 + 原始文件后缀"  
     */    
     public static String randomFilename(MultipartFile file) {
  
        // 校验文件对象  
        if (ObjectUtil.isNull(file)) {
            throw new RuntimeException("MinIO文件上传失败: 文件为空");  
        }  
  
        // 获取原始文件名  
        String filename = file.getOriginalFilename();  
  
        // 校验原始文件名  
        if (StrUtil.isBlank(filename)) {
            throw new RuntimeException("MinIO文件上传失败: 原始文件名为空");  
        }  
  
        // 生成随机文件名并返回  
        return UUID.randomUUID().toString().substring(26) + "-"
                + System.currentTimeMillis()  
                + filename.substring(filename.lastIndexOf("."));  
    }  
  
    /**  
     * 将文件上传到MinIO对象存储服务中
     *  
     * @param file       文件对象  
     * @param filename   文件名称  
     * @param dir        文件存储目录  
     * @param bucketName MinIO桶名  
     */  
    @SneakyThrows
    public static void upload(MultipartFile file, String filename, String dir, String bucketName) {  
  
        // 校验数据桶是否存在  
        if (!minioClient.bucketExists(bucketName)) {  
            throw new RuntimeException("MinIO文件上传失败: MinIO桶不存在");  
        }  
  
        // 校验上传目录  
        if (StrUtil.isBlank(dir)) {  
            throw new RuntimeException("MinIO文件上传失败: 文件上传目录为空");  
        }  
  
        // 使用putObject上传文件到指定Bucket  
        minioClient.putObject(bucketName, dir + "/" + filename,  
                file.getInputStream(),  
                file.getContentType());  
    }  
  
    /**  
     * 从MinIO中删除指定文件  
     *  
     * @param filename   文件名  
     * @param dir        文件存储目录  
     * @param bucketName MinIO桶名  
     */  
    @SneakyThrows  
    public static void delete(String filename, String dir, String bucketName) {  
  
        // 校验数据桶是否存在  
        if (!minioClient.bucketExists(bucketName)) {  
            throw new RuntimeException("MinIO文件上传失败: MinIO桶不存在");  
        }  
  
        // 校验上传目录  
        if (StrUtil.isBlank(filename)) {  
            throw new RuntimeException("MinIO文件删除失败: 文件名为空");  
        }  
  
        // 校验上传目录  
        if (StrUtil.isBlank(dir)) {  
            throw new RuntimeException("MinIO文件删除失败: 文件上传目录为空");  
        }  
  
        minioClient.removeObject(bucketName, dir + "/" + filename);  
    }  
}